import 'dart:math';

import 'package:dartkit/dartkit.dart';
import 'package:test/test.dart';

void main() {
  group("loop()：循环执行", () {
    test("loop测试", () {
      // 循环准确的次数
      int count = 0;
      loopSync(10, (_) => count++);
      expect(count, 10);
    });

    test("loop的order正确", () {
      // 当循环1次时，第一次的order应该为1
      int order = 0;
      loopSync(1, (o) => order = o);
      expect(order, 1);
      // 循环10次时，order应该递增为10
      loopSync(10, (o) => order = o);
      expect(order, 10);
    });
  });

  group("可能性测试", () {
    test("可能性测试", () {
      // 对于可能性为6%的事件，执行10000次后，大概会在500-700之间
      int count = 0;
      loopSync(10000, (_) => probability(6) ? count++ : null);
      expect(count > 500, isTrue);
      expect(count < 700, isTrue);
    });

    test("可能性异常测试", () {
      // 百分比必须在0-100之间
      expect(() => probability(-10), isBug);
      expect(() => probability(1000), isBug);
    });

    test("范围随机测试", () {
      loopSync(100, (_) {
        expect(Random().rangeDouble(4.5, 6.5), inInclusiveRange(4.5, 6.5));
      });
      // 无所谓大小
      loopSync(100, (_) {
        expect(Random().rangeDouble(6.5, 4.5), inInclusiveRange(4.5, 6.5));
      });
    });
  });

  test("浮点数测试", () {
    expect(3.415.cut(2), 3.42);
    expect(3.4112141241.cut(2), 3.41);
    expect(3.4112141241.cut(1), 3.4);
  });

  group("字符串测试", () {
    test("字符串简化功能", () {
      final string = "这是一串很长的字符串";
      expect(string.truncate(4), "这是一串...");
    });

    test("中英文区别对待", () {
      final string = "thisis很长的字符串";
      expect(string.truncate(5), "thisis很长...");
    });

    test("如果英文多了半个，则按一个算", () {
      final string = "this is很长的字符串";
      expect(string.truncate(5), "this is很...");
    });

    test("当字数足够时，不缩减", () {
      final string = "这是一串";
      expect(string.truncate(4), "这是一串");
    });

    test("去除空行", () {
      final String text = """
一串文字


""";
      expect(text.removeBlankLines(), "一串文字");
    });
  });
}
